﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.IO;
using System.Globalization;
using System.Threading;

namespace CopyFilesFromM3U
{
    public partial class Principal : Form, IReLocalizable
    {
        Lista lista;

        public Principal()
        {
            InitializeComponent();
        }
        /// <summary>
        /// Actualiza la Barra de progreso y la label con el porcentaje pasado como parámetro
        /// </summary>
        /// <param name="porcentaje">Porcentaje a mostrar por la laber y la barra de progreso</param>
        public void pgrBar_Actualizar(int porcentaje)
        {
            pgrBar.Value = porcentaje;
            lblPorcentaje.Text = porcentaje + "%";
            if (porcentaje == 100)//Cuando es 100% se muestra un mensaje presonalizado
            {
                lblPorcentaje.Text = Resources.StringsGenerales.lblFinalizado.ToString(); //se obtiene del archivo de recursos de idiomas
            }
            pgrBar.Update();
            lblPorcentaje.Update();
            pgrBar.Refresh();
            lblPorcentaje.Refresh();
        }

////////////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// Abre un cuadro de diálogo para seleccionar la Lista a procesar
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnLista_Click(object sender, EventArgs e)
        {
            try
            {
                OpenFileDialog openFileDialog1 = new OpenFileDialog();
                openFileDialog1.Filter = "Listas m3u (*.m3u)|*.m3u";
                openFileDialog1.FilterIndex = 2;
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    lista = new Lista(openFileDialog1.FileName);
                    txtLista.Text = lista.RutaFull;
                }
            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message, "Ha ocurrido un problema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                pgrBar.Value = 0;
                lblPorcentaje.Text = "0%";
            }
        }

////////////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// Abre un cuadro de diálogo para seleccionar la carpeta de destino(donde se guardarán los archivos)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDestino_Click(object sender, EventArgs e)
        {
            try
            {
                string targetPath = "";

                FolderBrowserDialog dialogoRuta = new FolderBrowserDialog();
                if (dialogoRuta.ShowDialog() == DialogResult.OK)
                {
                    targetPath = dialogoRuta.SelectedPath;
                    txtDestino.Text = targetPath;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ha ocurrido un problema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                pgrBar.Value = 0;
                lblPorcentaje.Text = "0%";
            }
        }
 ////////////////////////////////////////////////////////////////////////////////////////////////////
        private void btnProceso_Click(object sender, EventArgs e)
        {

            Mover(lista.lineas, lista.RutaSF, txtLista.Text, txtDestino.Text);
            txtDestino.Text = "";
            txtLista.Text = "";

        }
////////////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// Procesa la lista leída del fichero(con todas las líneas) y se encarga de mover las canciones
        /// de su directorio original al nuevo destino.
        /// </summary>
        /// <param name="linFich">Objeto List con las líneas leídas del fichero</param>
        /// <param name="rutaLista">Ruta de la Lista/Fichero m3u sin el nombre de este</param>
        /// <param name="rutaOrigen">Ruta Completa de la Lista/Fichero con nombre y extensión inclusive</param>
        /// <param name="rutaDestino">Directorio donde se almacenarán los archivos</param>
        public void Mover(List<String> linFich, string rutaLista, string rutaOrigen, string rutaDestino)
        {
            int cantLin = linFich.Count;
            int cont = 0;//contador auxiliar para la barra de progreso y porcentaje

            //recorremos toda la lista de canciones
            foreach (var cancion in linFich)
            {
                cont = cont + 1;

                //si la línea empieza por # se omite,ya que no es la ruta de la canción
                //si es la ruta,se comprueba que el archivo sea mp3
                if ((cancion[0] != '#') & (Path.GetExtension(cancion) == ".mp3"))
                {
                    pgrBar_Actualizar((cont * 100) / cantLin);//mandamos los datos de progreso a la barra y label

                    string ruta = Path.GetDirectoryName(cancion).ToString();//obtenemos la ruta de la línea leída
                    string fileName = Path.GetFileName(cancion);//obtenemos el nombre del archivo
                    
                    //Reconstruimos la ruta de acceso al archivo
                    //si el 2º carácter de la línea son ":" la ruta es absoluta y no se toca
                    //sinó es relativa y hay que reconstruirla con ruta original de la lista
                    if (ruta[1] != ':')
                    {
                        rutaOrigen = rutaLista + @"\" + Path.GetDirectoryName(cancion);
                    }
                    else
                    {
                        rutaOrigen = Path.GetDirectoryName(cancion);
                    }

                    try
                    {
                        // Creamos la ruta de origen y la de destino.
                        string sourceFile = System.IO.Path.Combine(rutaOrigen, fileName);
                        string destFile = System.IO.Path.Combine(rutaDestino, fileName);

                        // Creamos una nueva carpeta si es necesario
                        if (!System.IO.Directory.Exists(rutaDestino))
                        {
                            System.IO.Directory.CreateDirectory(rutaDestino);
                        }

                        // Copiamos el archivo a la nueva ruta, y si es necesario sustituye 
                        //al existente.
                        System.IO.File.Copy(sourceFile, destFile, true);
                    }
                    catch (Exception e)
                    {
                        MessageBox.Show(e.Message,"Ha ocurrido un problema",MessageBoxButtons.OK,MessageBoxIcon.Error);
                    }
                }
            }
        }
/////////////////////////////////////////////////////////////////////////////////////////
        //Si "alguna" ruta queda vacía,se desactiva el botón de Proceso
        private void txtLista_TextChanged(object sender, EventArgs e)
        {
            if ((txtLista.Text.Trim() != "") & (txtDestino.Text.Trim() != ""))
            {
                btnProceso.Enabled = true;
            }
            else
                btnProceso.Enabled = false;
        }
        //Si "alguna" ruta queda vacía,se desactiva el botón de Proceso
        private void txtDestino_TextChanged(object sender, EventArgs e)
        {
            if ((txtLista.Text.Trim() != "") & (txtDestino.Text.Trim() != ""))
            {
                btnProceso.Enabled = true;
            }
            else
                btnProceso.Enabled = false;
        }
/////////////////////////////////////////////////////////////////////////////////////////
        private void acercaDeToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }

        private void salirToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void acercaDeToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            About FormAcerca = new About();
            FormAcerca.ShowDialog(this);
        }

        private void descargarWinampToolStripMenuItem_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process.Start("http://www.winamp.com/");
        }


/////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// Cambio de idioma de la aplicación (Español,Inglés,Gallego)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void españolToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //Llama al procedimiento para activar la casilla Español y desactiva el resto
            itemExclusivosIdiomas("es");
            //Cambia la cultura actual por el idioma correspondiente,en este caso Español
            Thread.CurrentThread.CurrentCulture = new CultureInfo("es-Es");
            Thread.CurrentThread.CurrentUICulture = new CultureInfo("es-Es");
            Program.ReLocalizeAll(new CultureInfo("es-Es"));

        }
        private void inglésToolStripMenuItem_Click(object sender, EventArgs e)
        {
            itemExclusivosIdiomas("en");
            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-Us");
            Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-Us");
            Program.ReLocalizeAll(new CultureInfo("en-Us"));
        }
        private void galegoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            itemExclusivosIdiomas("gl");
            Thread.CurrentThread.CurrentCulture = new CultureInfo("gl-Es");
            Thread.CurrentThread.CurrentUICulture = new CultureInfo("gl-Es");
            Program.ReLocalizeAll(new CultureInfo("gl-Es"));
        }
        /// <summary>
        /// Marca como Checked el idioma seleccionado y desactiva los demás
        /// </summary>
        /// <param name="leng">abreviatura del idioma que se activa(es(español),gl(gallego),en(inglés))</param>
        private void itemExclusivosIdiomas(string leng)
        {
            galegoToolStripMenuItem.Checked = false;
            españolToolStripMenuItem.Checked = false;
            inglésToolStripMenuItem.Checked = false;

            switch (leng)
	        {
                case "es":
                    españolToolStripMenuItem.Checked = true;
                    break;
                case "gl":
                    galegoToolStripMenuItem.Checked = true;
                    break;
                case "en":
                    inglésToolStripMenuItem.Checked = true;
                    break;
		        default:
                    break;
	        }
        }
////////////////////////////////////////////////////////////////////////////////////////////////////////////
        #region Miembros de IReLocalizable
        /// <summary>
        /// Recarga todos los controles para que surta efecto el cambio
        /// de Idioma en tiempo de ejección
        /// </summary>
        public void ReLocalizarSubMenus(ToolStripItemCollection colOpcionesMenu)
        {
            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(this.GetType());
            resources.ApplyResources(this, "$this");

            // recorrer el submenú
            foreach (ToolStripItem itmOpcion in colOpcionesMenu)
            {
                resources.ApplyResources(itmOpcion, itmOpcion.Name);
                // si esta opción a su vez despliega un nuevo submenú
                // llamar recursivamente a este método para cambiar sus opciones
                if (((ToolStripMenuItem)itmOpcion).DropDownItems.Count > 0)
                {
                    this.ReLocalizarSubMenus(((ToolStripMenuItem)itmOpcion).DropDownItems);
                }
            }
        }
        public void ReLocalize()
        {
            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(this.GetType());
            resources.ApplyResources(this, "$this");
            foreach (Control c in this.Controls)
                resources.ApplyResources(c, c.Name);

            // recorrer las opciones del menú
            foreach (ToolStripMenuItem mnuitOpcion in this.menuStrip1.Items)
            {
                resources.ApplyResources(mnuitOpcion, mnuitOpcion.Name);
                if (mnuitOpcion.DropDownItems.Count > 0)
                {
                    //Recorremos los submenús
                    ReLocalizarSubMenus(mnuitOpcion.DropDownItems);
                }
            }
            //MessageBox.Show(CultureInfo.CurrentCulture.EnglishName);
        }
        #endregion
    }
}
